←
▼
▲
←
▼
▲
_getche
int _getch( void );
キーボードからの入力を1文字取得します。 入力があるまで待ちます。
#include <conio.h>
/***********************************************************************
<<< [getYesNo] Yes か No をユーザに尋ねる >>>
【引数】
・int default; Enter のみ押したときの返り値
・int ctrl_c; Ctrl+C を押したときの返り値
・int 返り値; Yes=1, No=0
************************************************************************/
int getYesNo( int _default, int ctrl_c )
{
int b = -1;
for (;;) {
int c = _getch();
if ( c == '\r' ) { printf( "\n" ); break; }
if ( c == 0x03 ) { printf( "^C\n" ); b = -2; break; } /* Ctrl+C */
if ( c == 0x08 ) { printf( "\b \b" ); b = -1; continue; } /* BS */
if ( c != 'Y' && c != 'y' && c != 'N' && c != 'n' ) continue;
if ( b != -1 ) printf( "\b" );
printf( "%c", c );
b = ( c == 'Y' || c == 'y' ); /* Y=1, N=0 */
}
if ( b == -1 ) b = _default; /* デフォルト */
else if ( b == -2 ) b = ctrl_c; /* Ctrl+C */
return b;
}
サンプル:
←
▼
▲
サンプルコード
char* _getcwd( char* cwd, int cwd_size );
【引数】
cwd
cwd_size
(出力)カレントフォルダ
メモリサイズ
wchar_t* _wgetcwd( wchar_t* cwd, int cwd_m );
cwd_m
最大文字数+1
cwd、エラー=NULL
返り値
→ GetCurrentDirectory
TCHAR* _tgetcwd( TCHAR* cwd, int cwd_size );
キーワード:
#include <direct.h>
TCHAR cwd[4096];
IF ( _tgetcwd( cwd, _countof(cwd) ) == NULL ) {e=E_OTHERS; goto fin;}
→ _tchdir
関連
_tgetcwd
←
▼
▲
clean,bat もあります
通常はこれをコピーして使います
→ コマンドライン・コンパイル
←
▼
▲
テンプレート:
含まれている内容:
→ test_template.lzh
→ test_template_snote.lzh
一般用、テストのみ
SnapNote 用、テストのみ
→ コマンドライン・コンパイル
関連
一般用、全部(ビルド、テスト、リリース)
標準出力をチェックする簡易自動テストバッチ
←
▼
▲
T_ALL_5_do_test.bat
T_ALL_7_clean.bat
T_Func.vbs
T_Func_ans.txt
T_Func_log.txt
T_ALL_result.txt
すべてのテストスクリプトを起動し、出力をチェックする
すべてのテストの出力を削除する
テスト・スクリプト(テスト・プログラム)の例
正しい出力の例
(テストを実行すると出力されるファイル) 出力の例
(テストを実行すると出力されるファイル) 全体の結果
T_ALL_5_do_test.bat をダブルクリックするとテストが始まります。
すべてのテストスクリプトを起動して、出力をチェックします。
すべての出力があっていたかどうかは、出力の最後の数行を確認してください。
Test log compare ...
Pass.
合っているとき
誤っているときの例
Fail in T_Func.vbs
Test log compare ...
Fail.
set T=T_Sample
echo ^<^<^< [%T%] ^>^>^>
( cscript %2 //nologo %T%.vbs %3 2>&1 ) > %T%_log.txt
fc %T%_ans.txt %T%_log.txt
if errorlevel 1 echo Fail in %T%.vbs>> T_ALL_result.txt&goto :last_of_test
T_ALL.bat は、下記のようなスクリプト(ブロック)が集まったものです。
1つのブロックが、1つのテストの実行に対応しています。
環境変数 T がテストシンボルです。必要に応じて変えてください。
(テストシンボル)+.vbs を起動しています。
(テストシンボル)+_log.txt が出力内容を記録したファイルです。
デバッグするときは、デバッグするテストに対応するブロックを先頭にコピーし、
ブロックの前後に、下記のように記述します。
echo on
(ブロック)
pause
上記のブロックをコピーして、環境変数の値を修正します。
上記は、VBScript を起動していますが、別のプログラムを起動してもかまいません。
標準出力をチェックする自動テストバッチ。
構造はシンプルですが、取り扱いが少し不便です。
T_ALL_5_do_test.bat が、それぞれのテスト・プログラムを起動します。
ファイル構成
参考
関連
複数のフォルダに、T_ALL_5_do_test.bat があるときは、ファイル名で検索して
すべて手動で起動してください。
自動テストの結果に手動テストを一覧することで、、テスターに残りのテストを通知
します。 下記のように T_ALL_result.txt に出力すると、最後にまとめて表示されます。
echo [ManualTest] %T% >> T_ALL_result.txt
[ManualTest] T_Test1
[ManualTest] T_Test2
Test log compare ...
Pass.
バッチファイル
表示例
→ テストツール
テストに失敗すると、T_ALL_result.txt に、失敗したテスト項目が記録されます。
T_ALL_result.txt は、T_ALL_5_do_test.bat が echo 出力したものなので、
T_ALL_5_do_test.bat の内容を調べることで、問題があったコマンドラインを確認できます。
Fail in T_Func.vbs
Test log compare ...
Fail.
Fail したときのT_ALL_result.txt の例:
pause までたどり着いたら Pass です。
バッチファイルの動きを表示します。
(新規)
set T=T_TestSet
echo ((( [%T%] )))
del "Test_logs.txt"
( %CL% %T%.vbs /set_input:2. 2>&1 ) > %T%_log.txt
fc "%T%_log.txt" "%T%_ans.txt"
if errorlevel 1 echo Fail in %T%.vbs>> T_ALL_result.txt&goto :last_of_test
findstr /C:"+ 1) T_TestSet" "%T%_log.txt"
if errorlevel 1 echo Fail in %T%.vbs>> T_ALL_result.txt&goto :last_of_test
出力内容をすべて比較する。
出力内容の一部を比較する。
参考
FCVbs テストツール フォルダ
←
▼
▲
エラー in C:\folderA\folderB\out.txt
C:\folderA がソースをインストールした任意のフォルダで、次のような出力結果が正しいとき、
out_ans.txt
そこで、out_ans.txt をバッチファイルで作成することで、インストールした状態が変わっても
自動的に判定することができるようになります。
C:\folderA の部分は、インストールした状態によって変わってしまいます。
つまり、単純なファイルの比較で、出力結果が正しいかどうかを自動的に判定することが
できません。
pushd ..\..
set base=%cd%
popd
set out=out_ans.txt
if exist %out% del %out%
echo エラー in %base%\folderB\out.txt>>%out%
echo.>>%out%
set out=
set base=
T_ALL_4_setup.bat
←ここを修正する
←ここで絶対パスを得る
絶対パスをすべて大文字にするとき
ツールによっては出力結果を勝手に大文字だけにするものがある。
これに対処するには、次のようにして、大文字だけが入った base_i 環境変数を使う。
cscript //nologo set_base_i.vbs > _set.bat & call _set.bat & del _set.bat
echo %base_i%\FILE.TXT
T_ALL_4_setup.bat
Set g_sh = WScript.CreateObject("WScript.Shell")
WScript.Echo "Set base_i="+ UCase( g_sh.CurrentDirectory )
set_base_i.vbs
Test.vbs
Sub test_setup( tests )
Dim base : base = g_sh.GetAbstructPathName( "..\.." )
Dim f : Set f = g_fs.CreateTextFile( "out_ans.txt", True, False )
f.WriteLine "エラー in " + base + "\folderB\out.txt"
f.WriteLine ""
Pass
End Sub
echo エラー in %base%\folderB\out.txt
echo.
out_ans.txt
..\..
out_ans.txt
"エラー in " + base + "\folderB\out.txt"
..\..
←
▼
▲
内部用と公開用、外部依存モジュールあり/なし、ソースパッケージとバイナリパッケージ、
のようにファイルの構成が大きく異なるときは、1つのフルパッケージから、それぞれの
パッケージを自動的に作成できるようにするとよいでしょう。
REM --- package name ---
set p=ModuleA
call :rmdir %p%
REM --- copy folder ---
call :copy ..\Modules_src\ModuleA %p%\ModuleA
if %r%==1 goto :eof
call :copy ..\Modules_src\ModuleB %p%\ModuleB
if %r%==1 goto :eof
modules_src
ModuleA
ModuleB
_pack
ModuleA_src
Modules_src
サンプル・パッケージの構成例
ModuleA_make.bat
Modules_make.bat
フルパッケージ
ModuleA のみのパッケージ
ModuleA と ModuleB を組み合わせたパッケージ
ModuleA_src フォルダを作成するバッチファイル
Modules_src フォルダを作成するバッチファイル
・ライブラリのソース、またはバイナリ
・ライブラリを使うアプリのサンプル
コンパイルエラーとリンクエラーをチェックするために、最低限下記のものが必要です。
この構成で、動作確認を行います。
rmdir, copy サブルーチンを使ったサンプル:
サンプル:
→ ver_pack.lzh
Modules_src
マスターファイル(コピー元)
ModuleA_patch
ModuleA をコピーした後に上書き修正するファイル
←
▼
▲
@echo off
if "%~1"=="" cmd /K %0 /wnd %1 %2 %3 %4
shift
pushd ..
REM base folder is vbslib_new
echo base folder is %cd%
echo OK?
pause
set src_name=vbs_inc.vbs
set src=TestByFCBat\vbs_inc\vbslib\%src_name%
for /R %%i in (%src_name%) do (
if exist "%%i" if not "%cd%\%src%"=="%%i" (
fc /A "%src%" "%%i"
if errorlevel 1 explorer /select, "%%i"&goto fin
)
)
:fin
echo.
echo done in %cd%
echo.
popd
set src_name=
set src=
比較&選択
echo %%i
xcopy /D "%src%" "%%i"
コピー
fc の行を変えます
src_name と src を、
マスターファイルの
パスにします
複数のフォルダにある同じ名前のファイルの内容を同じにします。
内容が異なると、マスターではない方のファイルを自動的に選択します。
←
▼
▲
do.bat
project_template
src
test
alltest
test1
alltest.bat
call_do.bat
do_each.bat
setting.bat
(a) メイン・バッチ
(d) 内部用(コール・バッチ)
(c) フォルダ一覧 (要修正)
(b) 環境変数設定 (要修正)
do.bat
(e) クリーン、ビルド、テストなどを実行 (要修正)
(e) クリーン、ビルド、テストなどを実行 (要修正)
alltest.bat
setting.bat
do_each.bat
call_do.bat
do.bat
(a) メイン・バッチ
(b) 環境変数設定 (要修正)
(c) フォルダ一覧 (要修正)
(d) 内部用(コール・バッチ)
(e) クリーン、ビルド、テストなどを実行 (要修正)
>auto
全フォルダのクリーン→リビルド→テストを実行します。
バッチファイルを起動するときは、カレントディレクトリに起動するバッチファイルが
ある状態で行ってください。
all
デフォルトの実行を表示して確認してから実行します。
>do build
1つのフォルダのリビルドを行います。
auto.bat と do.bat のパラメータに指定できるのは、次のとおりです。
(なし)
全フォルダのクリーン→ビルド→テスト→クリーンを実行します。
build
test
clean
リビルドを実行します。
テストを実行します。
クリーンを実行します。
全フォルダ(alltest.bat)、または1つのフォルダ(do.bat)に対して、ビルドやテストなどを行います。
テンプレート
if exist Build.dat del Build.dat
if exist Build.wrn del Build.wrn
if exist Build.err del Build.err
if exist Build.log del Build.log
set rmdir_path=obj
if exist %rmdir_path% rmdir /S /Q %rmdir_path%
if exist %rmdir_path% echo cannot delete %rmdir_path% & set r=1& goto :eof
set rmdir_path=
→ clean
PB delete
→ コマンドライン・コンパイル(VS2005)
→ batchlib.lzh
→ vbslib.lzh
vbslib 製テスト・プロンプトをお使いください。
←
▼
▲
echo ----- reset test folder -----
if exist test_do rmdir /S /Q test_do
mkdir test_do
xcopy /E /Y original test_do
echo cd .. & a.bat > a.bat
original フォルダ
テストを実行するバッチファイルの一部
リセット状態のファイル構成が入ったフォルダ
test_do フォルダ
リセットするテスト実施用フォルダ
test_do フォルダを一度削除し、originai フォルダの内容と一致させます(リセットします)。
clean.bat
for /D /R %%i in (test_do) do if exist "%%i" rmdir /S /Q "%%i"
テスト終了後に、すべての test_do フォルダを削除します
←
▼
▲
echo off
echo ----- setup tools -----
call ..\common\setting.bat
if (%test_prog%)==() echo not set %%test_prog%% & set r=1 & if (%no_pause%)==() pause & goto :eof
if not exist %test_prog% echo not found %test_prog% & set r=1 & if (%no_pause%)==() pause & goto :eof
set case=test1
echo ----- %case% -----
%test_prog% %case% > %case%_out.txt
%feq% %case%_out.txt %case%_ans.txt
if errorlevel 1 echo NG & set r=1 & if (%no_pause%)==() pause & goto :eof
set r=0 & echo Pass. if (%no_pause%)==() pause
REM ----- common setting -----
set test_prog="..\..\Debug\prog.exe"
プログラムのパスは、デバッグ版とリリース版、また、Program Files に入っていたりして、
変わることがよくあります。 そこで、各テストバッチファイルから、テストグループ共通の
setting.bat を呼び出すようにします。
setting.bat
clean.bat
del out1.txt
←
▼
▲
notepad.exe は、結果の表示に使うことができます。
if "%notepad%"=="" start "" notepad log.txt
if not "%notepad%"=="" start "" %notepad% log.txt
下記のバッチファイルは、notepad 環境変数が設定してあったら、別のプログラムで
log.txt を表示します。
me 設定
set notepad="C:\Program Files\sted\sted.exe"
←
▼
▲
all_test.bat
echo off
pushd test1
call test1.bat
popd
if not %r%==0 echo NG & set r=1 & goto :eof
set r=0 & echo Pass.
:eof2
if "%1"=="" pause
各テストのバッチファイルを呼び出し、テスト結果が入った環境変数をチェックします。
最後に表示される Pass か NG で全テストの結果を判定をします。
set errorlevel しても if errorlevel で判定できません。
←
▼
▲
.exe 形式の main 関数の返り値は、エラーレベルに格納されます。
if errorlevel 1 echo NG & set r=1 & goto :eof
1以上ならNG
if not errorlevel 1 echo NG & set r=1 & goto :eof
0 なら NG
echo %errorlevel% でエラーレベルの値が分かります。
errorlevel
)
、
エラーレベル
環境変数 r に代入していますが、これは、後述する全テスト実行バッチのためです。
set r=0 & echo Pass.
:eof2
if "%1"=="" pause
NG が無く、バッチファイルの最後まで来たら、次のように Pass したことを明示します。
参考
errorlevel 変数を使う
cscript sample.vbs
if not "%errorlevel%"=="21" ( echo ERROR & pause & exit /b 1 )
Windows2000以降?
cmd /v:on /c "prog1 & echo exit /b !ERRORLEVEL! > _tmp.bat" | prog2
call _tmp.bat
echo %ERRORLEVEL%
パイプの前段のエラーレベルを知りたいとき
関連
→ 終了コード (Linux)
エラーレベルを設定する
バッチ・ファイルから返すエラーレベルは設定できません。
exit /b 1 で呼び出し元へ戻ります。 1 は %errorlevel% に設定する値です。
exit 1 ですぐにバッチファイルを終了します。 1 は %errorlevel% に設定する値です。
exit に引数を指定しなければ、%errorlevel% の値は変わりません。
call :T_Example
if errorlevel 1 ( exit /b )
呼び出し先でエラーが発生したら、すぐにそのエラーを呼び出し元に返します。
関連
if や for の ( ) の中で errorlevel 変数を参照しないでください。
call :T_Example
if errorlevel 1 ( exit /b )
( ) の前の errorlevel 変数の値が参照されてしまいます。
if や for の ( ) の中でも、直前の呼び出しによって設定された errorlevel をチェックします。